<?xml version="1.0" encoding="UTF-8"?>

<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one or more
  ~ contributor license agreements.  See the NOTICE file distributed with
  ~ this work for additional information regarding copyright ownership.
  ~ The ASF licenses this file to You under the Apache License, Version 2.0
  ~ (the "License"); you may not use this file except in compliance with
  ~ the License.  You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util.xsd">
    <bean abstract="true" id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <!-- Set to true to enable distributed class loading for examples, default is false. -->
        <property name="peerClassLoadingEnabled" value="true"/>

        <property name="marshaller">
            <bean class="org.apache.ignite.internal.binary.BinaryMarshaller" />
        </property>

        <!-- Enable cache events for examples. -->
        <property name="includeEventTypes">
            <util:constant static-field="org.apache.ignite.events.EventType.EVTS_CACHE"/>
        </property>

        <!-- Cache configurations (all properties are optional). -->
        <property name="cacheConfiguration">
            <list>
                <!-- Partitioned cache example configuration (Atomic mode). -->
                <bean parent="cache-template">
                    <property name="name" value="partitioned"/>
                    <property name="cacheMode" value="PARTITIONED"/>
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="backups" value="1"/>

                    <property name="indexedTypes">
                        <list>
                            <!-- Key and value type for SQL table Long. -->
                            <value>java.lang.Integer</value>
                            <value>java.lang.Long</value>
                        </list>
                    </property>
                </bean>

                <!-- Partitioned cache example configuration (Atomic mode, PRIMARY write order mode). -->
                <bean parent="cache-template">
                    <property name="name" value="partitioned_primary"/>
                    <property name="cacheMode" value="PARTITIONED"/>
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="backups" value="1"/>
                </bean>

                <!-- Partitioned cache example configuration (Transactional mode). -->
                <bean parent="cache-template">
                    <property name="name" value="partitioned_tx"/>
                    <property name="cacheMode" value="PARTITIONED"/>
                    <property name="atomicityMode" value="TRANSACTIONAL"/>
                    <property name="nearConfiguration">
                        <bean class="org.apache.ignite.configuration.NearCacheConfiguration"/>
                    </property>
                    <property name="backups" value="1"/>
                </bean>

                <!-- Replicated cache example configuration (Atomic mode). -->
                <bean parent="cache-template">
                    <property name="name" value="replicated"/>
                    <property name="cacheMode" value="REPLICATED"/>
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="indexedTypes">
                        <list>
                            <!-- Key and value type for SQL table DimStore. -->
                            <value>java.lang.Integer</value>
                            <value>java.lang.Integer</value>
                        </list>
                    </property>
                </bean>

                <!-- Replicated cache example configuration (Transactional mode). -->
                <bean parent="cache-template">
                    <property name="name" value="replicated_tx"/>
                    <property name="cacheMode" value="REPLICATED"/>
                    <property name="atomicityMode" value="TRANSACTIONAL"/>
                </bean>
            </list>
        </property>

        <!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. -->
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <!-- In distributed environment, replace with actual host IP address. -->
                                <value>127.0.0.1:47500..47509</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

    <!-- Template for all example cache configurations. -->
    <bean id="cache-template" abstract="true" class="org.apache.ignite.configuration.CacheConfiguration">
        <!-- Set synchronous rebalancing (default is asynchronous). -->
        <property name="rebalanceMode" value="SYNC"/>

        <!-- Set to FULL_SYNC for examples, default is PRIMARY_SYNC. -->
        <property name="writeSynchronizationMode" value="FULL_SYNC"/>
    </bean>
</beans>
